home *** CD-ROM | disk | FTP | other *** search
- {
- VINCE LAURENT
-
- > Does anyone have a fast function for sorting two dates?
- > Something like function SortDate(Date1, Date2 : string): integer;
- > Strings would be in the format of '1/1/94' etc.
-
- Convert the dates to Julian Dates first...then you can do with them
- what you want. Here is a unit I got a long time ago...
- }
-
- UNIT Julian;
- {
- ////////////////////////////////////////// DEMO Routines
- /Begin
- / ClrScr;
- / GetDate(Year,Month,Day,Dow);
-
- / WriteLn('Year : ',Year);
- / WriteLn('Month : ',Month);
- / WriteLn('Day : ',Day);
- / WriteLn('DOW : ',Dow);
- / WriteLn(MachineDate);
- / JulianDate := DateToJulian(MachineDate);
- / WriteLn('Julian Date = ',JulianDate);
- / WriteLn('Jul To Date = ',JulianToDate(JulianDate));
- / WriteLn('Day Of Week = ',DayOfWeek(JulianDate));
- / WriteLn('Time = ',MachineTime(4));
- /End.
- ///////////////////////////////////////////////////////////////
- }
- INTERFACE
-
- Uses
- Crt, Dos;
-
- Type
- Str3 = String[3];
- Str8 = String[8];
- Str9 = String[9];
- Str11 = String[11];
-
- Var
- Hour,
- Minute,
- Second,
- S100,
- Year,
- Month,
- Day,
- Dow : Word;
- Syear,
- Smonth,
- Sday,
- Sdow : String;
- JulianDate : Integer;
-
- Function MachineTime(Len : Byte) : Str11;
- Function MachineDate : Str8;
- Function DateFactor(MonthNum, DayNum, YearNum : Real) : Real;
- Function DateToJulian(DateLine : Str8) : Integer;
- Function JulianToDate(DateInt : Integer): Str11;
- Function JulianToStr8(DateInt : Integer): Str8;
- Function DayofWeek(Jdate : Integer) : Str3;
- Procedure DateDiff(Date1,Date2 : Integer; VAR Date_Difference : Str9);
-
- IMPLEMENTATION
-
- Function MachineTime(Len : Byte) : Str11;
- Var
- I : Byte;
- TempStr : String;
- TimeStr : Array[1..4] Of String;
-
- Begin
- TempStr := '';
- FillChar(TimeStr, SizeOf(TimeStr),0);
- GetTime(Hour, Minute, Second, S100);
- Str(Hour, TimeStr[1]);
- Str(Minute, TimeStr[2]);
- Str(Second, TimeStr[3]);
- Str(S100, TimeStr[4]);
- TempStr := TimeStr[1];
- For I := 2 To Len Do
- TempStr := TempStr + ':' + TimeStr[I];
- MachineTime := TempStr;
- End;
-
- Function MachineDate : Str8;
- Begin
- GetDate(Year, Month, Day, Dow);
- Str(Year, Syear);
- Str(Month, Smonth);
- If Month < 10 Then
- Smonth := '0' + Smonth;
- Str(Day,Sday);
- If Day < 10 Then
- Sday := '0' + Sday;
- MachineDate := smonth + sday + syear;
- End;
-
- Function DateFactor(MonthNum, DayNum, YearNum : Real) : Real;
- Var
- Factor : Real;
- Begin
- Factor := (365 * YearNum) + DayNum + (31 * (MonthNum - 1));
- If MonthNum < 3 Then
- Factor := Factor + Int((YearNum-1) / 4) -
- Int(0.75 * (Int((YearNum-1) / 100) + 1))
- Else
- Factor := Factor - Int(0.4 * MonthNum + 2.3) + Int(YearNum / 4) -
- Int(0.75 * (Int(YearNum / 100) + 1));
- DateFactor := Factor;
- End;
-
- Function DateToJulian(DateLine : Str8) : Integer;
- Var
- Factor,
- MonthNum,
- DayNum,
- YearNum : Real;
- Ti : Integer;
- Begin
- If Length(DateLine) = 7 Then
- DateLine := '0' + DateLine;
- MonthNum := 0.0;
- For Ti := 1 to 2 Do
- MonthNum := (10 * MonthNum) + (Ord(DateLine[Ti])-Ord('0'));
- DayNum := 0.0;
- For Ti := 3 to 4 Do
- DayNum := (10 * DayNum) + (Ord(DateLine[Ti])-Ord('0'));
- YearNum := 0.0;
- For Ti := 5 to 8 Do
- YearNum := (10 * YearNum) + (Ord(DateLine[Ti])-Ord('0'));
- Factor := DateFactor(MonthNum, DayNum, YearNum);
- DateToJulian := Trunc((Factor - 679351.0) - 32767.0);
- End;
-
- Function JulianToDate(DateInt : Integer): Str11;
- Var
- holdstr,
- strDay : string[2];
- anystr : string[11];
- StrMonth : string[3];
- stryear : string[4];
- test,
- error,
- Year,
- Dummy, I : Integer;
- Save,
- Temp : Real;
- JulianToanystring : Str11;
- Begin
- holdstr := '';
- JulianToanystring := '00000000000';
- Temp := Int(DateInt) + 32767 + 679351.0;
- Save := Temp;
- Dummy := Trunc(Temp/365.5);
-
- While Save >= DateFactor(1.0,1.0,Dummy+0.0) Do
- Dummy := Succ(Dummy);
- Dummy := Pred(Dummy);
- Year := Dummy;
- (* Determine number Of Days into current year *)
- Temp := 1.0 + Save - DateFactor(1.0,1.0,Year+0.0);
- (* Put the Year into the output string *)
- For I := 8 downto 5 Do
- Begin
- JulianToanystring[I] := Char((Dummy mod 10) + Ord('0'));
- Dummy := Dummy div 10;
- End;
- Dummy := 1 + Trunc(Temp/31.5);
- While Save >= DateFactor(Dummy+0.0,1.0,Year+0.0) Do
- Dummy := Succ(Dummy);
- Dummy := Pred(Dummy);
- Temp := 1.0 + Save - DateFactor(Dummy+0.0,1.0,Year+0.0);
- For I := 2 Downto 1 Do
- Begin
- JulianToanystring[I] := Char((Dummy mod 10)+Ord('0'));
- Dummy := Dummy div 10;
- End;
- Dummy := Trunc(Temp);
-
- For I := 4 Downto 3 Do
- Begin
- JulianToanystring[I] := Char((Dummy mod 10)+Ord('0'));
- Dummy := Dummy div 10;
- End;
- holdstr := copy(juliantoanystring,1,2);
- val(holdstr, test, error);
- Case test Of
- 1 : StrMonth := 'Jan';
- 2 : StrMonth := 'Feb';
- 3 : StrMonth := 'Mar';
- 4 : StrMonth := 'Apr';
- 5 : StrMonth := 'May';
- 6 : StrMonth := 'Jun';
- 7 : StrMonth := 'Jul';
- 8 : StrMonth := 'Aug';
- 9 : StrMonth := 'Sep';
- 10 : StrMonth := 'Oct';
- 11 : StrMonth := 'Nov';
- 12 : StrMonth := 'Dec';
- End;
- stryear := copy(juliantoanystring, 5, 4);
- strDay := copy(juliantoanystring, 3, 2);
- anystr := StrDay + '-' + StrMonth + '-' +stryear;
- JulianToDate := anystr;
- End;
-
- Function JulianToStr8(DateInt : Integer): Str8;
- Var
- holdstr,
- StrMonth,
- strDay : string[2];
- anystr : string[8];
- stryear : string[4];
- test,
- error,
- Year,
- Dummy,
- I : Integer;
- Save,
- Temp : Real;
- JulianToanystring : Str8;
- Begin
- holdstr := '';
- JulianToanystring := '00000000';
- Temp := Int(DateInt) + 32767 + 679351.0;
- Save := Temp;
- Dummy := Trunc(Temp/365.5);
- While Save >= DateFactor(1.0,1.0,Dummy+0.0) Do
- Dummy := Succ(Dummy);
- Dummy := Pred(Dummy);
- Year := Dummy;
- (* Determine number Of Days into current year *)
- Temp := 1.0 + Save - DateFactor(1.0,1.0,Year+0.0);
- (* Put the Year into the output string *)
- For I := 8 downto 5 Do
- Begin
- JulianToanystring[I] := Char((Dummy mod 10)+Ord('0'));
- Dummy := Dummy div 10;
- End;
- Dummy := 1 + Trunc(Temp/31.5);
- While Save >= DateFactor(Dummy+0.0,1.0,Year+0.0) Do
- Dummy := Succ(Dummy);
- Dummy := Pred(Dummy);
- Temp := 1.0 + Save - DateFactor(Dummy+0.0,1.0,Year+0.0);
- For I := 2 Downto 1 Do
- Begin
- JulianToanystring[I] := Char((Dummy mod 10)+Ord('0'));
- Dummy := Dummy div 10;
- End;
- Dummy := Trunc(Temp);
-
- For I := 4 Downto 3 Do
- Begin
- JulianToanystring[I] := Char((Dummy mod 10)+Ord('0'));
- Dummy := Dummy div 10;
- End;
-
- holdstr := copy(juliantoanystring,1,2);
- val(holdstr, test, error);
- Case test Of
- 1 : StrMonth := '01';
- 2 : StrMonth := '02';
- 3 : StrMonth := '03';
- 4 : StrMonth := '04';
- 5 : StrMonth := '05';
- 6 : StrMonth := '06';
- 7 : StrMonth := '07';
- 8 : StrMonth := '08';
- 9 : StrMonth := '09';
- 10 : StrMonth := '10';
- 11 : StrMonth := '11';
- 12 : StrMonth := '12';
- End;
- StrYear := copy(juliantoanystring, 5, 4);
- StrDay := copy(juliantoanystring, 3, 2);
- AnyStr := StrMonth + StrDay + StrYear;
- JulianToStr8 := AnyStr;
- End;
-
- Function DayofWeek(Jdate : Integer) : Str3;
- Begin
- Case jdate MOD 7 Of
- 0 : DayofWeek := 'Sun';
- 1 : DayofWeek := 'Mon';
- 2 : DayofWeek := 'Tue';
- 3 : DayofWeek := 'Wed';
- 4 : DayofWeek := 'Thu';
- 5 : DayofWeek := 'Fri';
- 6 : DayofWeek := 'Sat';
- End;
- End;
-
- Procedure DateDiff(Date1, Date2 : Integer; Var Date_Difference : Str9);
- VAR
- Temp,
- Rdate1,
- Rdate2,
- Diff1 : Real;
- Diff : Integer;
- Return : String[9];
- Hold : String[3];
- Begin
- Rdate2 := Date2 + 32767.5;
- Rdate1 := Date1 + 32767.5;
- Diff1 := Rdate1 - Rdate2;
- Temp := Diff1;
- If Diff1 < 32 Then (* determine number of Days *)
- Begin
- Diff := Round(Diff1);
- Str(Diff,Hold);
- Return := Hold + ' ' + 'Day';
- If Diff > 1 Then
- Return := Return + 's ';
- End;
- If ((Diff1 > 31) And (Diff1 < 366)) Then
- Begin
- Diff1 := Diff1 / 30;
- Diff := Round(Diff1);
- Str(Diff,Hold);
- Return := Hold + ' ' + 'Month';
- If Diff > 1 Then
- Return := Return + 's';
- End;
- If Diff1 > 365 Then
- Begin
- Diff1 := Diff1 / 365;
- Diff := Round(Diff1);
-
- Str(Diff,Hold);
- Return := Hold;
- End;
- Date_Difference := Return;
- Diff := Round(Diff1);
- End;
-
- END.
-
-